/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.usercenter.das;

import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.mc.sdk.usercenter.dto.TenantDTO;
import cn.hallele.mc.sdk.usercenter.dto.TenantQueryDTO;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import cn.hallele.ms.usercenter.application.action.tenant.TenantApplicationService;
import cn.hallele.ms.usercenter.application.bo.TenantBO;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * hallele_ms_usercenter
 *
 * @author anle5
 * @since 2024/10/13 14:34
 */
@Slf4j
@Service
public class TenantDBDas extends ModelDas<TenantApplicationService, TenantDTO, TenantBO> {
    protected TenantDBDas(TenantApplicationService option) {
        super(option);
    }

    /**
     * 查询所有
     *
     * @param condition 查询条件
     * @return 所有租户
     */
    public List<TenantDTO> findAll(@Valid TenantDTO condition) {
        return revertList(this.option.findAll(convert(condition)));
    }

    /**
     * 分页查询
     *
     * @param condition 查询条件
     * @return 分页结果
     */
    public List<TenantDTO> findAllMoreCondition(TenantQueryDTO condition) {
        return revertList(this.option.findByNameLikeAndStatus(condition.getKeywords(), condition.getStatus()));
    }

    /**
     * 通过id查询记录
     *
     * @param id id
     * @return 满足要求的 数据
     */
    public TenantDTO findOneById(Integer id) {
        return revert(this.option.findOneById(id));
    }

    /**
     * 通过ids删除记录
     *
     * @param ids ids
     */
    public void deleteByIdIn(List<Integer> ids) {
        this.option.deleteByIdIn(ids);
    }

    /**
     * 更新 tenant
     *
     * @param tenantDTO 更新数据
     */
    public void updateOne(TenantDTO tenantDTO) {
        this.option.updateOne(convert(tenantDTO));
    }

    /**
     * 添加 tenant
     *
     * @param tenantDTO 添加数据
     */
    public void addOne(TenantDTO tenantDTO) {
        this.option.addOne(convert(tenantDTO));
    }

    /**
     * 将T转成E
     *
     * @param tenantDTO 被转换者
     * @return S 转换后者
     */
    @Override
    protected TenantBO convert(TenantDTO tenantDTO) {
        return ObjectUtil.map(tenantDTO, t -> TenantBO.builder()
                .id(t.getId())
                .name(t.getName())
                .parentId(t.getParentId())
                .treePath(t.getTreePath())
                .status(t.getStatus())
                .createTime(t.getCreateTime())
                .updateTime(t.getUpdateTime())
                .createBy(t.getCreateBy())
                .updateBy(t.getUpdateBy())
                .build());
    }

    /**
     * 将E回转陈T
     *
     * @param tenantBO 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected TenantDTO revert(TenantBO tenantBO) {
        return ObjectUtil.map(tenantBO, t -> TenantDTO.builder()
                .id(t.getId())
                .name(t.getName())
                .parentId(t.getParentId())
                .treePath(t.getTreePath())
                .status(t.getStatus())
                .createTime(t.getCreateTime())
                .updateTime(t.getUpdateTime())
                .createBy(t.getCreateBy())
                .updateBy(t.getUpdateBy())
                .build());
    }
}